﻿using Programming.DemoProject.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Programming.DemoProject.OOP
{
    /// <summary>
    /// OOP面向对象编程演练
    /// </summary>
    public class OOPShow
    {
        /// <summary>
        /// OOP面向对象编程
        /// 1 考虑有几个对象
        /// 2 封装屏蔽细节
        /// 3 还可以继承完成代码复用
        /// 4 支持多态，尤其是面向抽象编程
        /// 
        /// 内部升级---面向对象的内部还是面向过程的
        /// </summary>
        public static void Show()
        {
            Console.WriteLine("用户注册，提交信息");

            UserInfo userInfo = new UserInfo()
            {
                Account = "Administrator",
                Name = "Eleven",
                Password = "888888"
            };

            //还可以把校验也封装
            if (userInfo.Account == null)
            {
                Console.WriteLine("注册失败");
                return;
            }

            //MySQLDBHelper dbHelper = new MySQLDBHelper();

            //面向对象能应付更复杂的需求，能满足扩展的要求---想把MySQL换成SQLServer--直接改代码？难以维护，风险太大---违背开闭原则
            //依赖注入(面向抽象编程--工厂)--接口+实例，然后在需要替换时，只需要换个实例
            //SqlServerDBHelper dbHelper = new SqlServerDBHelper();

            //保证了程序的稳定性--靠的抽象+替换对象--80%的设计模式都是靠的这一招---但是如果我不想换掉对象，我只是去加点东西(日志)，
            IDBHelper dbHelper = SimpleFactory.CreateDBHelper();//new IDBHelper();//当然也可以IOC

            {
                //需要换成mysql数据库---DBHelper内部全部修改为mysql----上端不受影响
                //面向抽象---让上端只依赖于抽象而不是细节--可以扩展---最核心的就是依赖于抽象和多个实现---80%的设计模式都是靠的这一招
                //IDBHelper dbHelper = SimpleFactory.CreateDBHelper();// new MysqlDBHelper();
            }

            dbHelper.Save(userInfo);

            LogHelper.Log("用户注册成功");
        }
    }
}
